# 解决Pydantic版本警告问题
try:
    from pydantic import BaseModel
except ImportError:
    from pydantic.v1 import BaseModel

from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.agents import ZeroShotAgent, AgentExecutor

llm = ChatOpenAI(
    model="qwen-plus",
    api_key="sk-2c036d80d14a443f8769e072bb09a2e1",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    temperature=0
)

@tool
def calculator(expression: str) -> str:
    """用于计算加减乘除运算，参数:expression(必填，数学表达式,实列如:1+1)"""
    """
    计算加减乘除运算
    """
    try:
        # 使用 eval 计算表达式，但在实际项目中建议使用更安全的方式如 ast.literal_eval
        res = eval(expression)
        return f"结果:{expression}={res}"
    except Exception as e:
        return f"计算错误: {str(e)}"

tools = [calculator]

prompt_text = """
你是一个帮助用户解决问题的智能助手，你拥有以下工具:
{tools}

使用规则:
1:先理解问题:无需工具则直接回答,需要工具则调用工具(根据工具的描述匹配)
2:调用工具必须用格式：```json{{"name":"工具名","parameters":{{"参数名":"参数值"}}}}```（参数需齐全）；
3:拿到工具结果后, 判断是否继续调用工具, 如果需要继续调用工具,则调用工具,否则整理,返回结果;


用户的问题:{input}
"""

prompt = PromptTemplate(
    template=prompt_text,
    input_variables=["input", "tools"]
)

agent = ZeroShotAgent.from_llm_and_tools(
    llm=llm,          # 大语言模型（Agent的"大脑"）
    tools=tools,      # 工具列表（Agent可调用的外部能力）
    prompt=prompt,    # 提示词模板（定义Agent的行为规则）
    verbose=True      # 是否打印详细日志（调试用）
)

# 创建代理执行器
agent_chain = AgentExecutor.from_agent_and_tools(
    agent=agent,
    tools=tools,
    verbose=True
)

# 示例使用
if __name__ == "__main__":
    # 测试代理
    try:
        result = agent_chain.invoke({"input": "请计算123乘以456等于多少？"})
        print("最终答案:", result["output"])
    except Exception as e:
        print(f"执行过程中出现错误: {e}")